#include "ThreadPool.h"
#include <iostream>

// 构造函数：启动指定数量的工作线程
ThreadPool::ThreadPool(size_t threadnum) : stop_(false) {
    for (size_t i = 0; i < threadnum; ++i) {
        threads_.emplace_back([this,&i] {
            // 显示线程启动信息（包含ID和序号）
            std::cout << "Thread " << i << " started | ID: " << std::this_thread::get_id() << std::endl;
            while (true) {
                std::function<void()> task;
                
                // 临界区开始
                {
                    std::unique_lock<std::mutex> lock(mutex_);
                    
                    // 等待条件满足（有任务或线程池停止）
                    condition_.wait(lock, [this] {
                        return stop_ || !taskqueue_.empty();
                    });
                    
                    // 线程池停止且无任务时退出线程
                    if (stop_ && taskqueue_.empty()) return;
                    
                    // 取队首任务并移除
                    task = std::move(taskqueue_.front());
                    taskqueue_.pop();
                }
                // 临界区结束
                
                // 执行任务（在锁外执行以避免长时间阻塞）
                task();
                // 显示线程退出信息
                std::cout << "Thread " << i << " exited | ID: " << std::this_thread::get_id() << std::endl;
            }
        });
    }
}

// 添加任务到队列（线程安全）
void ThreadPool::addtask(std::function<void()> task) {
    {
        std::lock_guard<std::mutex> lock(mutex_);
        if (stop_) {
            throw std::runtime_error("ThreadPool stopped, cannot add task");
        }
        taskqueue_.push(std::move(task));
    }
    condition_.notify_one();  // 唤醒一个等待线程
}

// 析构函数：安全停止所有线程
ThreadPool::~ThreadPool() 
{
    {
        std::lock_guard<std::mutex> lock(mutex_);
        stop_ = true;  // 设置停止标志
    }
    condition_.notify_all();  // 唤醒所有线程
    
    // 等待所有线程完成当前任务
    for (auto& thread : threads_) {
        if (thread.joinable()) {
            thread.join();
        }
    }
}